package com.youbug.mall.auth.controller;

import cn.hutool.json.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.youbug.common.to.SocialUserTo;
import com.youbug.common.to.UmsMemberTo;
import com.youbug.common.util.HttpUtils;
import com.youbug.common.vo.R;
import com.youbug.mall.auth.feign.IAuthMemberFeignService;
import com.youbug.mall.auth.vo.SocialUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

import static com.youbug.common.constant.AuthServerConstant.LOGIN_USER;


@Slf4j
@Controller
public class OAuth2Controller {

    @Autowired
    private IAuthMemberFeignService memberFeignService;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping(value = "/giteeLogin")
    public String weibo(@RequestParam("code") String code, HttpSession session) throws Exception {

        Map<String, String> map = new HashMap<>();
        map.put("client_id","72181123b8ae52a4257f3f1bb1f6c3c009585d9ce15a5d1b4a93dcec627ae2b8");
        map.put("client_secret","754c6be4a70c335f36ca8cdd9a29271edd0e8661a55cc664b7ab7b1c56c169a1");
        map.put("grant_type","authorization_code");
        map.put("redirect_uri","http://www.gulimall.com/giteeLogin");
        map.put("code",code);

        //1、根据用户授权返回的code换取access_token
        HttpResponse response = HttpUtils.doPost("https://gitee.com", "/oauth/token",
                "post", new HashMap<>(), map, new HashMap<>());
        //2、处理
        if (response.getStatusLine().getStatusCode() == 200) {
            //获取到了access_token,转为通用社交登录对象
            String json = EntityUtils.toString(response.getEntity());

            JSONObject jsonObject = new JSONObject(json);

            SocialUser socialUser = jsonObject.toBean(SocialUser.class);

            //知道了哪个社交用户
            //1）、当前用户如果是第一次进网站，自动注册进来（为当前社交用户生成一个会员信息，以后这个社交账号就对应指定的会员）
            //登录或者注册这个社交用户
            System.out.println(socialUser.getAccess_token());
            //调用远程服务
            SocialUserTo userTo = new SocialUserTo();
            BeanUtils.copyProperties(socialUser, userTo);
            R<UmsMemberTo> oauthLogin = memberFeignService.oauthLogin(userTo);
            if (oauthLogin.getCode() == R.SUCCESS) {
                UmsMemberTo member = oauthLogin.getData();
                log.info("登录成功：用户信息：{}",member.toString());

                //1、第一次使用session，命令浏览器保存卡号，JSESSIONID这个cookie
                //以后浏览器访问哪个网站就会带上这个网站的cookie
                //TODO 1、默认发的令牌。当前域（解决子域session共享问题）
                //TODO 2、使用JSON的序列化方式来序列化对象到Redis中
                session.setAttribute(LOGIN_USER, member);
                ObjectMapper mapper = new ObjectMapper();
                stringRedisTemplate.opsForValue().set(LOGIN_USER+":"+member.getId(), mapper.writeValueAsString(member));
                //2、登录成功跳回首页
                return "redirect:http://gulimall.com";
            } else {
                return "redirect:http://auth.gulimall.com/mall/login.html";
            }
        } else {
            return "redirect:http://auth.gulimall.com/mall/login.html";
        }

    }

}
